package com.seeyon.ctp.rest.resources;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.collaboration.manager.ColManager;
import com.seeyon.apps.collaboration.po.ColSummary;
import com.seeyon.cap4.form.bean.FormBean;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.cap4.form.bean.FormDataSubBean;
import com.seeyon.cap4.form.bean.FormTableBean;
import com.seeyon.cap4.form.service.CAP4FormManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.filemanager.dao.AttachmentDAO;
import com.seeyon.ctp.common.filemanager.manager.FileManager;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.common.po.filemanager.Attachment;
import com.seeyon.ctp.common.po.filemanager.V3XFile;
import com.seeyon.ctp.util.UUIDLong;
import org.apache.commons.logging.Log;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Path("youc")
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON})
public class CustomDataBackFillResources extends BaseResource {

    private static final Log log = CtpLogFactory.getLog(CustomDataBackFillResources.class);
    private ColManager colManager = (ColManager) AppContext.getBean("colManager");
    private CAP4FormManager cap4FormManager = (CAP4FormManager) AppContext.getBean("cap4FormManager");
    private static FileManager fileManager = (FileManager) AppContext.getBean("fileManager");
    private static AttachmentDAO attachmentDAO = (AttachmentDAO) AppContext.getBean("attachmentDAO");


    /**
     * 处理更新表单数据状态的新请求
     * 该方法主要负责处理来自AI检测识别申请的数据回传，包括验证请求参数、更新表单数据以及处理附件
     *
     * @param param 包含请求参数的Map，包括表单数据ID、检测数据等
     * @return 返回一个Response对象，包含处理结果
     */
    @POST
    @Path("updateFormDataStateNew")
    public Response updateFormData(Map<String, Object> param) {
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            // 记录请求参数日志
            log.info("获取AI检测识别申请数据回传接口请求参数:" + JSON.toJSONString(param));
            JSONObject jsonObj = new JSONObject(param);

            // 验证ID参数是否存在
            if (!jsonObj.containsKey("id")) {
                result.put("code", 500);
                result.put("msg", "参数id为空!");
                return ok(result);
            }

            // 验证ID参数值是否为空
            if (jsonObj.containsKey("data")) {
                String dataId = str(jsonObj.get("id"));
                if ("".equals(dataId)) {
                    result.put("code", 500);
                    result.put("msg", "参数[id]不能为值!");
                    return ok(result);
                }

                // 根据表单代码获取表单对象
                FormBean formBean = cap4FormManager.getFormByFormCode("YCSBSQD");
                String subTableName = formBean.getFieldBeanByDisplay("不良类型").getOwnerTableName();

                // 根据ID获取表单数据主对象
                FormDataMasterBean formDataMasterBean = cap4FormManager.getDataMasterBeanById(Long.parseLong(dataId), formBean, null);
                if (formDataMasterBean == null) {
                    result.put("code", 500);
                    result.put("msg", "参数[id]的值[" + dataId + "]有误,系统中未查到数据!");
                    return ok(result);
                }

                // 获取摘要对象，用于附件处理
                ColSummary colSummary = colManager.getColSummaryByFormRecordId(Long.parseLong(dataId));

                // 处理子表数据
                List<Long> dataIdList = new ArrayList<Long>();
                List<FormDataSubBean> formDataSubBeans = formDataMasterBean.getSubData(subTableName);
                FormTableBean sub_formTableBean = formDataSubBeans.get(0).getFormTable();
                for (FormDataSubBean formDataSubBean : formDataSubBeans) {
                    String number = str(formDataSubBean.getFieldValue(formBean.getFieldBeanByDisplay("不良数量").getName()));
                    if ("".equals(number)) {
                        dataIdList.add(formDataSubBean.getId());
                    }
                }

                // 解析请求中的数据数组
                JSONArray dataJsonArray = jsonObj.getJSONArray("data");
                List<FormDataSubBean> subDatas = new ArrayList<FormDataSubBean>();
                for (int i = 0; i < dataJsonArray.size(); i++) {
                    JSONObject jsonObject = dataJsonArray.getJSONObject(i);
                    HashMap<String, Object> subData = new HashMap<String, Object>();
                    for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
                        subData.put(formBean.getFieldBeanByDisplay(entry.getKey()).getName(), str(entry.getValue()));
                    }

                    FormDataSubBean formDataSubBean = new FormDataSubBean(subData, sub_formTableBean, formDataMasterBean, false);
                    formDataSubBean.setIdIfNew();
                    formDataSubBean.setFormmainId(formDataMasterBean.getId());
                    subDatas.add(formDataSubBean);
                }
                formDataMasterBean.setSubData(subTableName, subDatas);

                // 处理附件：word、excel、png
                if (jsonObj.containsKey("word")) {
                    String word_fileId = str(jsonObj.get("word"));
                    if (!"".equals(word_fileId)) {
                        Long sub_reference = UUIDLong.longUUID();
                        addAttachment(Long.parseLong(word_fileId), colSummary.getId(), sub_reference);
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("检测结果1").getName(), sub_reference);
                    }
                }
                if (jsonObj.containsKey("excel")) {
                    String excel_fileId = str(jsonObj.get("excel"));
                    if (!"".equals(excel_fileId)) {
                        Long sub_reference = UUIDLong.longUUID();
                        addAttachment(Long.parseLong(excel_fileId), colSummary.getId(), sub_reference);
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("检测结果2").getName(), sub_reference);
                    }
                }
                if (jsonObj.containsKey("png")) {
                    String png_fileId = str(jsonObj.get("png"));
                    if (!"".equals(png_fileId)) {
                        Long sub_reference = UUIDLong.longUUID();
                        addAttachment(Long.parseLong(png_fileId), colSummary.getId(), sub_reference);
                        formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("检测结果3").getName(), sub_reference);
                    }
                }
                // 删除空行数据
                if (!dataIdList.isEmpty()) {
                    for (int i = 0; i < dataIdList.size(); i++) {
                        formDataMasterBean.removeSubData(subTableName, dataIdList.get(i));
                    }

                }
                // 保存或更新表单数据
                cap4FormManager.saveOrUpdateFormData(formDataMasterBean, formBean.getId(), true, null);
            }

            // 返回成功结果
            result.put("code", 200);
            result.put("msg", "数据更新成功!");
            return ok(result);
        } catch (Exception e) {
            // 异常处理
            log.error("AI检测识别申请数据回调接口异常信息:", e);
            result.put("code", 500);
            result.put("msg", "回调数据失败,请联系管理员!" + e.getMessage());
            return ok(result);
        }
    }


    /**
     * 将给定对象转换为字符串
     * 如果对象为null，返回空字符串；如果对象是字符串类型，直接返回；
     * 否则，返回对象的toString()方法的结果
     *
     * @param o 要转换为字符串的对象
     * @return 对象的字符串表示，或空字符串（如果对象为null）
     */
    private static String str(Object o) {
        // 检查对象是否为null，是则返回空字符串
        if (o == null) {
            return "";
        }
        // 如果对象本身就是字符串，直接返回该字符串
        if (o instanceof String) {
            return (String) o;
        }
        // 对于其他情况，返回对象的toString()结果
        return o.toString();
    }

    /**
     * 向系统中添加附件信息
     * 此方法用于将文件管理系统中的文件信息作为附件添加到系统中
     * 它根据文件ID获取文件信息，并创建一个新的附件对象，设置相关属性，
     * 然后保存到数据库中
     *
     * @param fileId        文件ID，用于从文件管理系统中获取文件信息
     * @param summaryId     概览ID，表示附件所属的概览信息
     * @param sub_reference 子引用ID，用于进一步细化附件的归属或分类
     */
    private static void addAttachment(Long fileId, Long summaryId, Long sub_reference) {
        try {
            // 根据文件ID获取文件信息
            V3XFile v3xFile = fileManager.getV3XFile(fileId);
            if (v3xFile == null) {
                throw new BusinessException("附件Id[" + summaryId + "]有误,系统中未查询到该条附件信息,请核对附件是否上传成功!");
            }
            // 创建一个新的附件对象
            Attachment attachment = new Attachment();
            // 如果是新附件，则生成唯一ID
            attachment.setIdIfNew();
            // 设置附件类别，此处硬编码为66
            attachment.setCategory(66);
            // 设置附件创建日期
            attachment.setCreatedate(v3xFile.getCreateDate());
            // 设置附件描述
            attachment.setDescription(v3xFile.getDescription());
            // 设置附件文件名
            attachment.setFilename(v3xFile.getFilename());
            // 设置附件文件URL，使用文件ID作为引用
            attachment.setFileUrl(v3xFile.getId());
            // 设置附件所属的概览信息ID
            attachment.setReference(summaryId);
            // 设置附件的子引用ID
            attachment.setSubReference(sub_reference);
            // 设置附件类型
            attachment.setType(v3xFile.getType());
            // 设置附件的MIME类型
            attachment.setMimeType(v3xFile.getMimeType());
            // 设置附件大小
            attachment.setSize(v3xFile.getSize());
            // 设置附件排序，此处硬编码为1
            attachment.setSort(1);

            // 保存附件信息到数据库
            attachmentDAO.save(attachment);
        } catch (Exception e) {
            // 日志记录添加附件信息失败的情况
            log.error("添加附件信息失败:", e);
        }
    }
}